/*
 * Carlos: Este es la clase que manejara el formulario de registro/modificacion
 * de los parametros de un medico. Sera utilizada directamente por la clase
 * GestionMedicosAction (principalmente por sus dos alias "CrearMedicos"
 * y "ModificarMedicos")
 */


package infb.forms;

import infb.dao.EspecialidadesInterfaz;
import infb.modelo.Medicos;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;

/**
 *
 * @author ddedde
 */
public class SetMedicosForm extends org.apache.struts.action.ActionForm {

    private String  dni_;
    private String  numColegiado_;
    private String  nombre_;
    private String  apellido1_;
    private String  apellido2_;
    private FormFile  foto_;
    private String  telefono_;
    private String  mail_;
    private String  fechaIncorporacion_;
    private String  direccion_;

    private String  password_;
    private String  horaInicioConsulta_;
    private String  horaFinConsulta_;

    private String  especialidad_;


    public String getApellido1() {
        return apellido1_;
    }

    public String getApellido2() {
        return apellido2_;
    }

    public String getDni() {
        return dni_;
    }

    public String getEspecialidad() {
        return especialidad_;
    }

    public String getNombre() {
        return nombre_;
    }

    public String getNum_colegiado() {
        return numColegiado_;
    }

    public String getPassword() {
        return password_;
    }

    public void setApellido1(String apellido1) {
        this.apellido1_ = apellido1;
    }

    public void setApellido2(String apellido2) {
        this.apellido2_ = apellido2;
    }

    public void setDni(String dni) {
        this.dni_ = dni;
    }

    public void setEspecialidad(String especialidad) {
        this.especialidad_ = especialidad;
    }

    public void setNombre(String nombre) {
        this.nombre_ = nombre;
    }

    public void setNum_colegiado(String num_colegiado) {
        this.numColegiado_ = num_colegiado;
    }

    public void setPassword(String password) {
        this.password_ = password;
    }

    public String getDireccion() {
        return direccion_;
    }

    public String getFecha_incorporacion() {
        return fechaIncorporacion_;
    }

    public FormFile getFoto() {
        return foto_;
    }

    public String getHora_fin_consulta() {
        return horaFinConsulta_;
    }

    public String getHora_inicio_consulta() {
        return horaInicioConsulta_;
    }

    public String getMail() {
        return mail_;
    }

    public String getTelefono() {
        return telefono_;
    }

    public void setDireccion(String direccion) {
        this.direccion_ = direccion;
    }

    public void setFecha_incorporacion(String fecha_incorporacion) {
        this.fechaIncorporacion_ =  fecha_incorporacion;
    }

    public void setFoto(FormFile foto) {
        this.foto_ = foto;
    }

    public void setHora_fin_consulta(String hora_fin_consulta) {
        this.horaFinConsulta_ = hora_fin_consulta;
    }

    public void setHora_inicio_consulta(String hora_inicio_consulta) {
        this.horaInicioConsulta_ = hora_inicio_consulta;
    }

    public void setMail(String mail) {
        this.mail_ = mail;
    }

    public void setTelefono(String telefono) {
        this.telefono_ = telefono;
    }


    /**
     *
     */
    public SetMedicosForm() {
        super();
        // TODO Auto-generated constructor stub
    }

/*
     * Metodo privado para comprobar que el nif introducido
     * es valido (ya sea un nif o un nie).
     * Se utilizara el algoritmo matematico ya conocido
     */
    private boolean nifValido(String nif) {
     /*   if(nif.startsWith("x") || nif.startsWith("X")){
            nif=nif.substring(1);
        }
        Pattern patron=Pattern.compile("(\\d{1,8})([TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])");
        Matcher m = patron.matcher(nif);
        if(m.matches()){
            String letra=m.group(2);
            String letras="TRWAGMYFPDXBNJZSQVHLCKE";
            int dni=Integer.parseInt(m.group(1));
            dni=dni%23;
            String referencia=letras.substring(dni,dni+1);
            if(referencia.equalsIgnoreCase(letra)){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }*/return true;
    }

    /*
     * Metodo privado para comprobar si un Strin es un numero
     */
    private boolean esNumero(String cadena){
        try {
            Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException e){
            return false;
        }
    }

    /*
     * Metodo privado para comprobar que el nif introducido
     * es valido (ya sea un nif o un nie).
     * Se utilizara el algoritmo matematico ya conocido
     */
    private boolean numColegiadoValido(String numColegiado) {
        if(esNumero(numColegiado)){
            if(Integer.parseInt(numColegiado)<=999999999){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

    /*
     * Metodo privado para comprobar que el telefono introducido
     * es valido (solo comprobamos que este entre 100000000 y 999999999).
     */
    private boolean numTelefonoValido(String numTelefono) { 
        return ((numTelefono.charAt(0)=='9')||(numTelefono.charAt(0)=='6'))&&numTelefono.length()==9&&esNumero(numTelefono);
    }

    /*
     * Metodo privado para comprobar que horas son validas
     * (solo comprobamos que este entre 00 y 24).
     */
    private boolean horaValida(String hora) {
        if(esNumero(hora)){
            Integer num =Integer.parseInt(hora);
            if( (num>=0)&&(num<=24)){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

    /*
     * Metodo privado para comprobar que el mail tiene formato correcto
     * (solo comprobamos que tenga formato nombre@servidor.dominio).
     */
    private boolean mailValido(String mail) {
        boolean cumplePatron = Pattern.matches("\\w++@\\w++\\.\\w++", mail);
        if(cumplePatron){
            return true;
        }else{
            return false;
        }
    }

    /*
     * Metodo privado para comprobar que la foto tiene formato correcto
     * (comprobamos si el tipo de archivo elegido es una imagen).
     */
    private boolean fotoValida(String tipoArchivo) {
        return tipoArchivo.startsWith("image");
    }

    /*
     * Metodo para validar la entrada del usuario. Se invoca automaticamente
     * por el mecanismo interno de Struts
     */
    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        // creacion de un objeto ActionErrors en blanco
       ActionErrors errores=new ActionErrors();


        if((this.dni_== null)||(this.dni_.equalsIgnoreCase(""))){
            errores.add("dni",new ActionMessage("formularios.set_medicos.errores.dni.vacio"));
        }else if(!nifValido(this.dni_)){
            errores.add("dni",new ActionMessage("formularios.set_medicos.errores.dni.invalido"));
        }

       if((this.numColegiado_== null)||(this.numColegiado_.equalsIgnoreCase(""))){
            errores.add("num_colegiado",new ActionMessage("formularios.set_medicos.errores.num_colegiado.vacio"));
        }else if(!numColegiadoValido(this.numColegiado_)){
            errores.add("num_colegiado",new ActionMessage("formularios.set_medicos.errores.num_colegiado.invalido"));
        }

        if((this.nombre_== null)||(this.nombre_.equalsIgnoreCase(""))){
            errores.add("nombre",new ActionMessage("formularios.set_medicos.errores.nombre.vacio"));
        }

         if((this.apellido1_.equalsIgnoreCase(""))||(this.apellido1_== null)){
            errores.add("apellido1",new ActionMessage("formularios.set_medicos.errores.apelllido1.vacio"));
        }


        if((this.password_.equalsIgnoreCase(""))||(this.password_== null)){
            errores.add("password",new ActionMessage("formularios.set_medicos.errores.password.vacio"));
        }


        if(!(this.telefono_== null)&&!(this.telefono_.equalsIgnoreCase("")) ){
            if(!numTelefonoValido(this.telefono_)){
                errores.add("telefono",new ActionMessage("formularios.set_medicos.errores.telefono.invalido"));
            }
        }

        
        if(!(this.mail_== null)&&!(this.mail_.equalsIgnoreCase("")) ){
            if(!mailValido(this.mail_)){
                    errores.add("mail",new ActionMessage("formularios.set_medicos.errores.mail.invalido"));
            }
        }

        if((this.foto_.getFileSize()!= 0)){
            if(!fotoValida(this.foto_.getContentType())){
                    errores.add("foto",new ActionMessage("formularios.set_medicos.errores.foto.invalido"));
            }
        }

        HttpSession sesion=request.getSession();
        Medicos objetoValidar=new Medicos();
        objetoValidar.setDni(this.dni_);
        objetoValidar.setNombre(nombre_);
        objetoValidar.setApellido1(apellido1_);
        objetoValidar.setApellido2(apellido2_);
        objetoValidar.setDireccion(direccion_);                
        try {///////////////ESPECIALIDAD/////////////
            Context contexto;
            contexto = new InitialContext();
            EspecialidadesInterfaz especialidades = (EspecialidadesInterfaz) contexto.lookup("EspecialidadesEJB");
            objetoValidar.setEspecialidad(especialidades.buscarEspecialidadporNombre(especialidad_));
        } catch (NamingException ex) {
            Logger.getLogger(SetMedicosForm.class.getName()).log(Level.SEVERE, null, ex);
        }
        //objetoValidar.setFoto(foto_);
        objetoValidar.setHoraInicioConsulta(new Short(horaInicioConsulta_));
        objetoValidar.setHoraFinConsulta(new Short(horaFinConsulta_));
        objetoValidar.setMail(mail_);
        objetoValidar.setNumColegiado(numColegiado_);
        objetoValidar.setPassword(password_);
        objetoValidar.setTelefono(telefono_);

        sesion.setAttribute("fechaIncorporacion", fechaIncorporacion_);
        if(sesion.getAttribute("objetoModificar")==null){//vamos a Crear            
            sesion.setAttribute("objetoValidar", objetoValidar);
        }else{//vamos a modificar
            sesion.setAttribute("objetoModificar", objetoValidar);
        }

        return errores;
    }
}
